package com.mrogrape.notepad.ui.editor;

import java.io.File;
import java.util.Locale;

import com.mrogrape.notepad.resource.Strings;
import com.mrogrape.util.StringUtils;

/**
 * 此类描述了内容类型，用于打开，保存文件以及供编辑器确定渲染方案。
 * 
 * <p>
 * 内容类型对象是不可变的。对于所有属性，都是不区分大小写的。
 * 
 * @author Ice Spring
 */
public class ContentType {
	
	/** 预定义的内容类型：纯文本 */
	public static final ContentType PLAIN_TEXT = new ContentType(
			"text/plain",
			Strings.ShortDescription.CONTENT_TYPE_PLAIN_TEXT,
			Strings.FullDescription.CONTENT_TYPE_PLAIN_TEXT,
			"txt",
			new String[]{"txt","csv"});
	
	/** 预定义的内容类型：Java源代码 */
	public static final ContentType JAVA = new ContentType(
			"text/java",
			Strings.ShortDescription.CONTENT_TYPE_JAVA,
			Strings.FullDescription.CONTENT_TYPE_JAVA,
			"java",
			new String[]{"java"});
	
	/** 预定义的内容类型：SQL脚本 */
	public static final ContentType SQL = new ContentType(
			"text/sql",
			Strings.ShortDescription.CONTENT_TYPE_SQL,
			Strings.FullDescription.CONTENT_TYPE_SQL,
			"sql",
			new String[]{"sql","prc"});
	
	/** 预定义的内容类型：HTML文档 */
	public static final ContentType HTML = new ContentType(
			"text/html",
			Strings.ShortDescription.CONTENT_TYPE_HTML,
			Strings.FullDescription.CONTENT_TYPE_HTML,
			"html",
			new String[]{"html","htm","xhtml","xhtm"});
	
	/** 预定义的内容类型：XML文档 */
	public static final ContentType XML = new ContentType(
			"text/xml",
			Strings.ShortDescription.CONTENT_TYPE_XML,
			Strings.FullDescription.CONTENT_TYPE_XML,
			"xml",
			new String[]{"xml"});
	
	// *******************Fields*************************
	
	/** 内容的MIME类型 */
	private String mimeType;
	
	/** 一个简短的描述，比如“Java源文件” */
	private String shortDescription;
	
	/** 对该类型更加详细的完整描述。 */
	private String fullDescription;
	
	/** 首选的文件扩展名 */
	private String preferredFileExtension;
	
	/** 所有支持的文件扩展名 */
	private String[] supportedFileExtension;
	
	/**
	 * 创建一个内容类型对象。
	 * 
	 * @param mimeType 内容的MIME类型，不可为空。
	 * @param shortDescription 对内容类型的简短描述，不可为空。
	 * @param fullDescription 对内容类型的完整描述
	 * @param preferenceFileExtension 该内容类型的文件首选的文件扩展名，不可为空。
	 * @param supportedFileExtension 所有该内容类型可以使用的文件扩展名，不可为空。
	 */
	public ContentType(String mimeType, String shortDescription,
			String fullDescription, String preferenceFileExtension,
			String[] supportedFileExtension) {
		
		if(StringUtils.isEmpty(mimeType)||StringUtils.isEmpty(shortDescription)||StringUtils.isEmpty(preferenceFileExtension)){
			throw new IllegalArgumentException("Parameters cannot be empty");
		}
		
		if(supportedFileExtension == null || supportedFileExtension.length == 0){
			throw new IllegalArgumentException("Supported File Extension Array can not be empty.");
		}
		
		this.mimeType = mimeType.toLowerCase(Locale.ENGLISH);
		this.shortDescription = shortDescription;
		this.fullDescription = fullDescription;
		this.preferredFileExtension = preferenceFileExtension;
		this.supportedFileExtension = supportedFileExtension;
	}
	
	// *******************Methods*************************

	/**
	 * 测试以某个文件名命名的文件是否支持此内容类型。
	 */
	public boolean isFileNameSupportedFor(String filename){
		
		if(StringUtils.isEmptyAfterTrim(filename)){return false;}
		
		int index = filename.lastIndexOf(".");
		if(index < filename.length()- 1 && index > 0){
			String extension = filename.substring(index + 1);
			for(String supported : this.getSupportedFileExtension()){
				if(supported.equalsIgnoreCase(extension)){
					return true;
				}
			}
		}
		return false;
	}
	
	/**
	 * 测试某个文件是否支持当前内容类型。
	 */
	public boolean isFileSupportedFor(File file){
		
		if(file == null){
			return false; 
		}
		else if(file.isDirectory()){
			return false;
		}
		
		return this.isFileNameSupportedFor(file.getName());
	}
	
	// *******************Getters and Setters*************************

	/**
	 * @return the mimeType
	 */
	public String getMimeType() {
		return this.mimeType;
	}

	/**
	 * @return the shortDescription
	 */
	public String getShortDescription() {
		return this.shortDescription;
	}

	/**
	 * @return the fullDescription
	 */
	public String getFullDescription() {
		return this.fullDescription;
	}

	/**
	 * @return the preferredFileExtension
	 */
	public String getPreferredFileExtension() {
		return this.preferredFileExtension;
	}

	/**
	 * @return the supportedFileExtension
	 */
	public String[] getSupportedFileExtension() {
		return this.supportedFileExtension;
	}
	
}
